package com.xuetang9.service.a.impl;

import com.github.pagehelper.PageHelper;
import com.xuetang9.dao.UserMapper;
import com.xuetang9.domain.User;
import com.xuetang9.dto.InputDto;
import com.xuetang9.dto.a.ListRequestDTO;
import com.xuetang9.dto.a.UserDTO;
import com.xuetang9.service.UserService;
import com.xuetang9.utils.DateUtil;
import com.xuetang9.vo.ListVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @工能 处理用户模块新增、查询业务的实现类
 * @作者 杜目杰
 * @时间 2020/5/12
 * @地点 公司
 * @版本 1.0.0
 * @版权 老九学堂
 */
@Service("UserServiceImplA")
public class UserServiceImpl implements UserService {
    // 创建user表的数据存取对象
    @Autowired
    UserMapper userMapper;

    /**
     *  根据输入信息选择对应的查询业务处理方法并得到结果
     * @param inputDto 输入信息
     * @return 查询结果
     */
    @Override
    public ListVO listUser(InputDto inputDto) {
        // 保存前端显示数据
        ListVO listVO = new ListVO();
        // 得到要处理的业务名称
        String in = inputDto.function;
        //选中对应的功能处理业务
        switch(in){
            case"查询用户":
                    listVO = selectUser(inputDto);
        }
        return listVO;
    }

    /**
     * 根据输入信息选择对应的添加业务处理方法并得到结果
     * @param inputDto 输入信息
     * @return
     */
    @Override
    public int insertUser(InputDto inputDto) {
        int result = -1;
        // 得到要处理的业务名称
        String in = inputDto.function;
        //选中对应的功能处理业务
        switch(in){
            case"添加用户":
                result = addUser(inputDto);
        }
        return result;
    }

    /**
     * 执行添加业务功能
     * @param inputDto 数据类型为用户的输入对象
     * @return 添加结果
     */
    private int addUser(InputDto<User> inputDto) {
        int insertReshult = insertByUser( inputDto.date);
        return insertReshult;
    }

    /**
     * 添加用户
     * @param user 需要添加的用户
     * @return 添加结果
     */
    private int insertByUser(User user) {
        return userMapper.insertUser(user);
    }

    /**
     *  处理查询用户业务
     * @param inputDto 查询用户携带的数据
     * @return 前端查询显示对象
     */
    private ListVO selectUser(InputDto<ListRequestDTO<User>> inputDto) {
        // 保存前端显示数据
        ListVO<List> listVO = new ListVO<>();
        //开启分页
        PageHelper.startPage(inputDto.date.page,inputDto.date.pageSize);
        // 根据请求数据查询符合条件的用户
        List<User> users = selectByUser(inputDto.date.request);
        // 将查询出来的数据集合转化为前端需要的信息集合
        listVO.setResult(getUserDTOsFromUsers(users));
        return listVO;
    }

    /**
     * 将集合中的所有用户信息提取或转化为前端需要的信息
     * @param users 用户集合
     * @return 用户显示信息集合
     */
    private List<UserDTO> getUserDTOsFromUsers(List<User> users) {
        // 保存转化后的用户信息集合
        List<UserDTO> userDTOS = new ArrayList<>();
        // 循环遍历将每个用户的信息提取和转化为前端需要的数据
        for (User u:  users
             ) {
            userDTOS.add(getUseDTOsFromUser(u));
        }
       return userDTOS;
    }

    /**
     * 将用户信息提取或转化为前端需要的信息
     * @param u 用户
     * @return 前端显示需要的用户信息
     */
    private UserDTO getUseDTOsFromUser(User u) {

        // 保存转化后的结果
        UserDTO userDTO = new UserDTO();
        // 将时间格式转化为yyyy-MM-dd HH:mm:ss格式的字符串
        String time = DateUtil.changeStyle(u.getUpdateTime());
        // 启用状态
        boolean status = "启用".equals(u.getStatus());
        // 保存
        userDTO.setId(u.getId() + "");
        userDTO.setAccount(u.getAccount());
        userDTO.setName(u.getName());
        userDTO.setRole(u.getRoles());
        userDTO.setEmail(u.getEmail());
        userDTO.setTime(time);
        userDTO.setStatus(status);
        return userDTO;
    }

    /**
     * 更具用户表对应的查询条件插查询
     * @param user 用户查询条件
     * @return 查询结果
     */
    private List<User> selectByUser(User user) {
        return userMapper.listUser(user);
    }



    ;
}
